/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package sdc;

/**
 *  オブジェクトの障害状態を表すクラス．
 * @author yamazaki
 */
public abstract class StatefulObject {

    /**
     * オブジェクトが障害を起こしているか否か．
     * falseなら正常．
     */
    private boolean failed = false;

    /**
     * オブジェクトが障害を起こしているか否かを返す．
     * @return 障害発生ならtrue
     */
    public boolean isFailed() {
        return failed;
    }

    /**
     * オブジェクトに障害を発生させる．
     */
    public void failure() {
        if(isFailed()) {
            throw new RuntimeException();
        }
        doFailure();
        failed = true;
    }

    /**
     * オブジェクトを障害から復旧させる．
     */
    public void recovre() {
        if(!isFailed()) {
            throw new RuntimeException();
        }
        doRecover();
        failed = false;
    }

    /**
     * 継承先で障害発生の内容を記述する．
     */
    protected abstract void doFailure();

    /**
     * 継承先で障害復旧の内容を記述する．
     */
    protected abstract void doRecover();

}
